﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область СлужебныеПроцедурыИФункции

Процедура ЗарегистрироватьДанныеКОбработкеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	Запрос = Новый Запрос(
	"ВЫБРАТЬ
	|	ПравилаПроверкиУчета.Ссылка КАК Ссылка
	|ИЗ
	|	Справочник.ПравилаПроверкиУчета КАК ПравилаПроверкиУчета
	|ГДЕ
	|	ПравилаПроверкиУчета.Использование
	|	И ПравилаПроверкиУчета.Идентификатор В(&ИдентификаторыПроверок)");
	
	ПроверкиВеденияУчета = КонтрольВеденияУчетаСлужебныйПовтИсп.ПроверкиВеденияУчета().Проверки;
	ПараметрыОтбора = Новый Структура;
	ПараметрыОтбора.Вставить("Отключена", Истина);
	ОтключенныеПроверки = ПроверкиВеденияУчета.НайтиСтроки(ПараметрыОтбора);
	
	ИдентификаторыПроверок = Новый Массив;
	Для Каждого ОтключеннаяПроверка Из ОтключенныеПроверки Цикл
		ИдентификаторыПроверок.Добавить(ОтключеннаяПроверка.Идентификатор);
	КонецЦикла;
	
	Запрос.УстановитьПараметр("ИдентификаторыПроверок", ИдентификаторыПроверок);
	Ссылки = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
	ОбновлениеИнформационнойБазы.ОтметитьКОбработке(Параметры, Ссылки);
	
КонецПроцедуры

Процедура ОбработатьДанныеДляПереходаНаНовуюВерсию(Параметры) Экспорт
	
	ОбработкаЗавершена = Истина;
	
	ОбъектМетаданных = Метаданные.Справочники.ПравилаПроверкиУчета;
	ПолноеИмяОбъекта = ОбъектМетаданных.ПолноеИмя();
	
	ОбъектовОбработано = 0;
	ПроблемныхОбъектов = 0;
	
	ОтключаемаяПроверка = ОбновлениеИнформационнойБазы.ВыбратьСсылкиДляОбработки(Параметры.Очередь, ПолноеИмяОбъекта);
	Пока ОтключаемаяПроверка.Следующий() Цикл
		ОтключаемаяПроверкаСсылка = ОтключаемаяПроверка.Ссылка;
		ПредставлениеСсылки = Строка(ОтключаемаяПроверкаСсылка);
		НачатьТранзакцию();
		
		Попытка
			
			Блокировка = Новый БлокировкаДанных;
			ЭлементБлокировки = Блокировка.Добавить(ПолноеИмяОбъекта);
			ЭлементБлокировки.УстановитьЗначение("Ссылка", ОтключаемаяПроверкаСсылка);
			
			Блокировка.Заблокировать();
			
			ОтключаемаяПроверкаОбъект = ОтключаемаяПроверкаСсылка.ПолучитьОбъект();
			ОтключаемаяПроверкаОбъект.Использование = Ложь;
			ОбъектовОбработано = ОбъектовОбработано + 1;
			
			ОбновлениеИнформационнойБазы.ЗаписатьДанные(ОтключаемаяПроверкаОбъект);
			
			ЗафиксироватьТранзакцию();
			
		Исключение
			
			ОтменитьТранзакцию();
			
			ПроблемныхОбъектов = ПроблемныхОбъектов + 1;
			
			Комментарий = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
				НСтр("ru = 'Не удалось обработать правило проверки %1 по причине:
				|%2'"), 
				ПредставлениеСсылки, ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
			
			ЗаписьЖурналаРегистрации(
				ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(),
				УровеньЖурналаРегистрации.Предупреждение,
				ОбъектМетаданных,
				ОтключаемаяПроверкаСсылка,
				Комментарий);
				
			КонецПопытки;
			
	КонецЦикла;
	
	Если Не ОбновлениеИнформационнойБазы.ОбработкаДанныхЗавершена(Параметры.Очередь, ПолноеИмяОбъекта) Тогда
		ОбработкаЗавершена = Ложь;
	КонецЕсли;
	
	Если ОбъектовОбработано = 0 И ПроблемныхОбъектов <> 0 Тогда
		ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Не удалось обработать некоторые правила проверки (пропущены): %1'"), 
			ПроблемныхОбъектов);
		ВызватьИсключение ТекстСообщения;
	Иначе
		ЗаписьЖурналаРегистрации(ОбновлениеИнформационнойБазы.СобытиеЖурналаРегистрации(), 
			УровеньЖурналаРегистрации.Информация, , ,
		СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
			НСтр("ru = 'Обработана очередная порция правил проверки: %1'"),
			ОбъектовОбработано));
	КонецЕсли;
	
	Параметры.ОбработкаЗавершена = ОбработкаЗавершена;
	
КонецПроцедуры

#КонецОбласти

#КонецЕсли